package com.sun.module_network

/**
 *@author:sunc
 *@time :2025/8/20 10:04
 *@desc:异常扩展函数
 * */
/**
 * 创建API异常的扩展函数
 * 此函数为Error类型扩展了一个createException方法，用于创建ApiException实例
 *
 * @param cause 可选参数，导致异常的根本原因，类型为Throwable?
 * @param code 可选的错误代码，默认为-1000。用于标识特定的业务错误类型。
 * @param message 可选参数，自定义的异常信息，类型为String?
 * @param context 可选参数，包含异常相关上下文信息的Map，类型为Map<String, Any>，默认为空Map
 * @return 返回一个ApiException实例，包含传入的Error信息、自定义消息、原因和上下文
 */
fun Error.createException(  // 为Error类型扩展的createException函数
    cause: Throwable? = null,  // 可选参数，表示异常的根本原因
    code: Long=-1000,
    message: String? = null,  // 可选参数，表示自定义的异常信息
    context: Map<String, Any> = emptyMap()  // 可选参数，表示异常相关的上下文信息
): ApiException {  // 函数返回ApiException类型
    return ApiException(this, code,message, cause, context)  // 创建并返回ApiException实例
}

/**
 * 创建业务异常的扩展函数
 *
 * 此函数为Error类型创建了一个扩展函数，用于生成BusinessException实例。
 * 它允许将Error对象转换为业务异常，并可以附加自定义消息、原因和上下文信息。
 *
 * @param cause 可选的异常原因，默认为null。表示导致此异常的根本原因。
 * @param code 可选的错误代码，默认为-1000。用于标识特定的业务错误类型。
 * @param message 可选的自定义错误消息，默认为null。如果提供，将覆盖Error的默认消息。
 * @param context 可选的上下文信息映射，默认为空Map。包含与异常相关的额外数据。
 * @return 返回一个BusinessException实例，包含Error对象、消息、原因和上下文信息。
 */
fun Error.createBusinessException(
    cause: Throwable? = null,
    code: Long=-1000,
    message: String? = null,
    context: Map<String, Any> = emptyMap()
): BusinessException {
    // 使用提供的参数创建并返回一个新的BusinessException实例
    return BusinessException(this, code,message, cause, context)
}

/**
 * 创建系统异常的扩展函数
 *
 * 此函数为Error类创建一个扩展函数，用于将Error对象转换为SystemException实例。
 * 通过这种方式，可以方便地将系统底层错误转换为应用层可处理的异常类型。
 *
 * @param cause 可选的Throwable对象，表示异常的根本原因。默认为null。
 * @param code 可选的Int类型错误码，用于标识异常类型。默认值为-1000。
 * @param message 可选的String消息，用于提供额外的异常信息。默认为null。
 * @param context 可选的Map<String, Any>，包含异常相关的上下文信息。默认为空Map。
 * @return 返回一个SystemException实例，包含原始Error、消息、原因和上下文信息。
 */
fun Error.createSystemException(
    cause: Throwable? = null,
    code: Long=-1000,
    message: String? = null,
    context: Map<String, Any> = emptyMap()
): SystemException {
    return SystemException(this, code,message, cause, context)
}